package com.shop.loan.util.pdf;
import lombok.Data;

/**
 * 文本块信息
 * Author：
 * Date：2022-08-25 01:01
 */
@Data
public class TextChunkRenderInfo {
    /**
     * 文本内容
     */
    private String text;
    /**
     * 文本左下角横坐标
     */
    private float minX;
    /**
     * 文本左下角纵坐标
     */
    private float minY;
    /**
     * 文本右上角横坐标
     */
    private float maxX;
    /**
     * 文本右上角纵坐标
     */
    private float maxY;

    /**
     * 有参构造函数
     *
     * @param text 文本内容
     * @param minX 文本左下角横坐标
     * @param minY 文本左下角纵坐标
     * @param maxX 文本右上角横坐标
     * @param maxY 文本右上角纵坐标
     */
    public TextChunkRenderInfo(String text, float minX, float minY, float maxX, float maxY) {
        this.text = text;
        this.minX = minX;
        this.minY = minY;
        this.maxX = maxX;
        this.maxY = maxY;
    }

    /**
     * 获取文本的高度
     *
     * @return 文本高度
     */
    public float getWordHeight() {
        return this.maxY - this.minY;
    }

    /**
     * 获取文本文字宽度
     *
     * @return 文本文字宽度
     */
    public float getWordWidth() {
        float fullWidth = this.maxX - this.minX;
        return fullWidth / this.text.length();
    }

    /**
     * 获取单词在文本内容中的位置及匹配的长度
     *
     * @param word      待匹配的单词
     * @param textStart 从文本的第几个字符开始匹配
     * @param wordStart 从单词第几个字符开始匹配
     * @return 匹配结果 0：从第几位开始匹配成功，1：word中从第一个字符开始连续匹配成功长度
     */
    public int[] getTextContainWordInfo(String word, int textStart, int wordStart) {
        int firstMatchIndex = 0; // 第一次匹配成功索引
        int matchLength = 0; // 匹配长度

        char[] textChars = this.text.toCharArray();
        char[] wordChars = word.toCharArray();
        for (int i = textStart - 1; i < textChars.length; i++) {
            int textIndex = -1;
            for (int j = wordStart - 1; j < wordChars.length; j++) {
                textIndex = i + j - wordStart + 1;
                // 只要存在一个不匹配就匹配不上
                if (textChars[textIndex] != wordChars[j]) {
                    textIndex = -1;
                    break;
                }
                // j之前都匹配成功了，如果匹配长度超出了text文本长度，则跳出循环，说明只匹配成功了部分
                if (textIndex >= textChars.length - 1) {
                    break;
                }
            }
            if (textIndex >= 0) { // 说明匹配成功了，不管text是否走完都跳出循环
                firstMatchIndex = i;
                matchLength = textIndex - i + 1;
                break;
            }
        }
        if (matchLength > 0) {
            return new int[]{firstMatchIndex + 1, matchLength};
        }
        return null;
    }
}
